//全局声明变量区域
#include<stdio.h>
#define MAX 1024



//程序1
//初级统计字符（无法统计中文，遇到中文报错）
void test1()
{
	char str1[MAX];
	printf("请输入一段字符串：");
	fgets(str1, MAX, stdin);
	/*
	fgets 函数用于从指定文件中读取字符串
	函数原型:
		#include <stdio.h>
		...
		char *fgets(char *s, int size, FILE *stream);

	参数解析：
		参数						含义
		s						字符型指针，指向用于存放读取字符串的位置
		size					指定读取的字符数（包括最后自动添加的 '\0'）
		stream					该参数是一个 FILE 对象的指针，指定一个待操作的数据流
	
	一般使用 fgets()搭配数组使用，stdin的含义就是从第一个字符开始读取
	*/
		

	char* target = str1;

	int length = 0;
	while (*target++ != '\0')
	/*不能用(*str++ != '\0')的原因是因为str是一个数组名字,
	数组名（也可以理解为数组就是一个固定的地址,无法进行修改，而指针是可以被修改的，指针是一个左值）是一个常量是不可被改变的,
	但是++需要搭配一个可改变的变量，既需要左值（左值是一个变量，可以被修改与改变）*/
	{
		length++;
	}
	printf("你输入了%d个字符", length - 1 /*此处是因为fgets在读取的时候将'\n'一起读取了，故需要在计数器-1过滤'\n'*/);
}

//程序二进阶代码

void test2()
{
	char str[MAX];
	char* target = str;
	char ch;
	int length = 0;

	printf("请输入一个字符串：");
	fgets(str, MAX, stdin);

	while (1)
	{
		ch = *target++;
		if (ch == '\0')
		{
			break;
		}

		//因为每个中文字节在系统存储空间中为负值，以此规律，我们只要检测一个字符对应的整型值是否为负数，如果是（中文字符）
		// 则将指针往后移动某个字节，VS2023中中文占据3个字节.如下：
		if ((int)ch < 0)
		{
			target += 1;
			
		}
		length++;
	}

	printf("您总共输入了 %d 个字符！\n", length - 1);

}



//主程序
int main()
{
	/*
		索引			作用
		test1		初级统计字符（无法统计中文，遇到中文报错）
		test2		进阶统计字符
	
	*/
	test1();
	return 0;
}